#ifndef _C_CAMERA_H_
#define _C_CAMERA_H_

#include "../cuCommon/cuTypes.h"

enum e_Camera_Movements
{
  e_StepForward,
  e_StepBackward,
  e_StrafeLeft,
  e_StrafeRight
};

class C_Camera
{
protected:
  float3 eye, dir, up, at;   
  float  fov, asp, zn, zf;

public:
	C_Camera();

	C_Camera(const float3 & eye, 
					 const float3 & dir, 
					 const float3 & up, 
					 float fov, float asp, 
					 float zn, float zf);

	void Default();

	float3 Right(); 
	
	inline float3 At()    { return at; }
	inline float3 Up()    { return up; }
	inline float3 Dir()   { return dir; }
	inline float3 Eye()   { return eye; }
	
	inline float  zF()    { return zf; } 
	inline float  zN()    { return zn; }
	inline float  Asp()   { return asp; }
	inline float  FoV()   { return fov; }

	float zF(float zf);
	float zN(float zn);
	float Asp(float asp);
	float FoV(float fov_angle);

	float3 Up(float3 up);
	float3 Up(float x, float y, float z);
	
	float3 At(float3 at);
	float3 At(float x, float y, float z);

	float3 Dir(float3 dir);
	float3 Dir(float x, float y, float z);

	float3 Eye(float3 eye);
	float3 Eye(float x, float y, float z);

	void Update(float dx, float dy);
  void Update(uint32 direction, float speed = 1.0f);  

	void DUR();
	void DUR(float3 dir);
	void DUR(float x, float y, float z);
};

#endif // _C_CAMERA_H_